﻿using Microsoft.AspNetCore.Mvc;
using wwl.Contract.Dtos.Requests.Rbac;
using wwl.Contract.Enums;
using wwl.Contract.Interfaces.Rbac;
using wwl.WebApi.Controllers.Common;

namespace wwl.WebApi.Controllers.Rbac
{
  /// <summary>
  /// 租户管理API控制器（WebApi层）
  /// 继承BaseController，复用通用能力（统一响应、模型验证、身份获取）
  /// 属于权限模块（Rbac）的接口入口，负责接收前端租户相关HTTP请求，转发至应用层服务处理
  /// 遵循RESTful API设计规范，提供租户CRUD及分页查询功能，响应格式全局统一
  /// </summary>
  [Route("api/[controller]")]
  public class TenantsController : BaseController
  {
    private readonly ITenantService _tenantService;

    /// <summary>
    /// 初始化租户控制器（构造函数注入租户服务）
    /// </summary>
    /// <param name="tenantService">租户领域服务实例（由依赖注入容器自动注入）</param>
    /// <remarks>
    /// 依赖注入说明：
    /// - ITenantService 接口在启动时通过 Autofac 容器注册具体实现
    /// - 控制器生命周期为 Scoped，确保服务实例在请求范围内共享
    /// - 构造函数注入遵循显式依赖原则，便于单元测试 Mock
    /// </remarks>
    public TenantsController(ITenantService tenantService)
    {
      _tenantService = tenantService;
    }

    /// <summary>
    /// 按ID查询租户详情（HTTP GET请求）
    /// </summary>
    /// <param name="id">租户唯一标识（从URL路径参数获取）</param>
    /// <returns>
    /// - 成功：HTTP 200 + ApiResponse&lt;TenantDto&gt;（code=0，data为租户信息）
    /// - 失败：HTTP 200 + ApiResponse&lt;TenantDto&gt;（code=3001，提示租户不存在）
    /// </returns>
    /// <remarks>
    /// 接口路径：GET api/Tenants/{id}
    /// 示例：GET api/Tenants/123e4567-e89b-12d3-a456-426614174000
    /// 成功响应示例：
    /// <code>
    /// {
    ///   "code": 0,
    ///   "message": "查询成功",
    ///   "data": { "id": "123...", "tenantCode": "T001", "tenantName": "测试租户" },
    ///   "timestamp": 1730947200000
    /// }
    /// </code>
    /// </remarks>
    [HttpGet("{id}")]
    public async Task<IActionResult> GetById(string id)
    {
      var tenantDto = await _tenantService.GetByIdAsync(id);
      return tenantDto == null
          ? FailResult(CustomErrorCode.Resource_NotFound, $"租户 '{id}' 不存在")
          : SuccessResult(tenantDto, "查询成功");
    }

    /// <summary>
    /// 创建新租户（HTTP POST请求）
    /// </summary>
    /// <param name="request">创建租户的请求参数</param>
    /// <returns>
    /// - 成功：HTTP 200 + ApiResponse&lt;TenantDto&gt;（code=0，data为新租户信息）
    /// - 失败：
    ///   1. 参数验证失败：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Param_ValidationFailed"/>）
    ///   2. 参数长度/空值错误：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Param_LengthExceed"/>）
    ///   3. 租户编码已存在：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Business_DuplicateData"/>）
    /// </returns>
    /// <remarks>
    /// 接口路径：POST api/Tenants
    /// 请求体示例：<code>{ "tenantCode": "T001", "tenantName": "测试租户" }</code>
    /// </remarks>
    [HttpPost]
    public async Task<IActionResult> Create(CreateTenantRequest request)
    {
      if (!CheckModelState())
        return (FailResult(CustomErrorCode.Param_ValidationFailed, "参数验证失败"));

      try
      {
        var createdBy = GetCurrentUserId();
        var newTenantDto = await _tenantService.CreateAsync(request, createdBy);
        return SuccessResult(newTenantDto, "租户创建成功");
      }
      catch (ArgumentException ex) when (ex.Message.Contains("长度") || ex.Message.Contains("为空"))
      {
        return FailResult(CustomErrorCode.Param_LengthExceed, ex.Message);
      }
      catch (Exception ex) when (ex.Message.Contains("已存在"))
      {
        return FailResult(CustomErrorCode.Business_DuplicateData, ex.Message);
      }
    }

    /// <summary>
    /// 更新租户信息（HTTP PUT请求）
    /// </summary>
    /// <param name="id">待更新租户的唯一标识（从URL路径参数获取）</param>
    /// <param name="request">更新租户的请求参数（从HTTP请求体获取）</param>
    /// <returns>
    /// - 成功：HTTP 200 + ApiResponse&lt;TenantDto&gt;（code=0，data为更新后租户信息）
    /// - 失败：
    ///   1. 参数验证失败：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Param_ValidationFailed"/>）
    ///   2. 租户不存在：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Resource_NotFound"/>）
    ///   3. 参数格式/状态错误：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Param_InvalidFormat"/>）
    ///   4. 系统异常：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.System_UnknownError"/>）
    /// </returns>
    /// <remarks>
    /// 接口路径：PUT api/Tenants/{id}
    /// 请求体示例：
    /// <code>
    /// {
    ///   "tenantName": "更新后的租户名称",
    ///   "status": "ENABLED",
    ///   "remarks": "更新备注"
    /// }
    /// </code>
    /// </remarks>
    [HttpPut("{id}")]
    public async Task<IActionResult> Update(string id, UpdateTenantRequest request)
    {
      if (!CheckModelState())
        return FailResult(CustomErrorCode.Param_ValidationFailed, "参数验证失败，请检查输入的租户信息是否符合要求");

      try
      {
        var updatedTenantDto = await _tenantService.UpdateAsync(id, request);
        return SuccessResult(updatedTenantDto, "租户更新成功");
      }
      catch (KeyNotFoundException ex)
      {
        return FailResult(CustomErrorCode.Resource_NotFound, ex.Message);
      }
      catch (ArgumentException ex) when (ex.Message.Contains("状态") || ex.Message.Contains("格式"))
      {
        return FailResult(CustomErrorCode.Param_InvalidFormat, ex.Message);
      }
      catch (Exception ex)
      {
        return FailResult(CustomErrorCode.System_UnknownError, "租户更新失败：" + ex.Message);
      }
    }

    /// <summary>
    /// 删除租户（HTTP DELETE请求，执行逻辑删除）
    /// </summary>
    /// <param name="id">待删除租户的唯一标识（从URL路径参数获取）</param>
    /// <returns>
    /// - 成功：HTTP 200 + ApiResponse（code=0，无业务数据）
    /// - 失败：HTTP 200 + ApiResponse（code=3001，提示租户不存在）
    /// </returns>
    /// <remarks>
    /// 接口路径：DELETE api/Tenants/{id}
    /// 说明：执行逻辑删除（设置IsDeleted=true），保留数据审计痕迹
    /// </remarks>
    [HttpDelete("{id}")]
    public async Task<IActionResult> Delete(string id)
    {
      var deleteSuccess = await _tenantService.DeleteAsync(id);
      return deleteSuccess
          ? SuccessResult("租户删除成功")
          : FailResult(CustomErrorCode.Resource_NotFound, $"租户 '{id}' 不存在");
    }

    /// <summary>
    /// 分页查询租户列表（HTTP GET请求）
    /// </summary>
    /// <param name="request">分页查询参数（从URL查询字符串获取）</param>
    /// <returns>
    /// - 成功：HTTP 200 + ApiResponse&lt;PagedResult&lt;TenantDto&gt;&gt;（code=0，data为分页结果）
    /// - 失败：
    ///   1. 参数验证失败：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.Param_ValidationFailed"/>）
    ///   2. 系统异常：HTTP 200 + ApiResponse（code=<see cref="CustomErrorCode.System_UnknownError"/>）
    /// </returns>
    /// <remarks>
    /// 接口路径：GET api/Tenants
    /// 支持筛选条件：tenantCode（模糊）、tenantName（模糊）、status（精确）
    /// 分页参数说明：
    /// - pageIndex：页码（≥1，默认1，通过模型验证确保合法性）
    /// - pageSize：每页记录数（1-100，默认20，通过模型验证确保合法性）
    /// 其他支持参数：SortBy（排序字段）、SortDesc（是否降序）、Fields（返回字段）、IncludeProperties（关联属性）
    /// 请求示例：
    /// <code>
    /// GET api/Tenants?pageIndex=1&amp;pageSize=10&amp;tenantName=测试&amp;SortBy=CreateTime&amp;SortDesc=true
    /// </code>
    /// </remarks>
    [HttpGet]
    public async Task<IActionResult> GetPaged([FromQuery] TenantPagedRequest request)
    {
      if (!CheckModelState())
        return FailResult(CustomErrorCode.Param_ValidationFailed, "参数验证失败，请检查输入的查询条件是否符合要求");

      try
      {
        var pagedResult = await _tenantService.GetPagedAsync(request);
        return SuccessResult(pagedResult, "租户列表查询成功");
      }
      catch (Exception ex)
      {
        return FailResult(CustomErrorCode.System_UnknownError, "租户列表查询失败：" + ex.Message);
      }
    }
  }
}